package utils

import (
	"image"
	"image/color"
	"math/rand"
)

func DrawCaptcha() (string, *image.RGBA, error) {
	// 随机生成4位数的验证码
	var numArr = []string{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}
	var code = ""
	for i := 0; i < 4; i++ {
		var index = rand.Intn(len(numArr))
		code += numArr[index]
	}

	// 创建验证码图片
	img := image.NewRGBA(image.Rect(0, 0, 100, 40))

	// 设置背景色
	for y := 0; y < 40; y++ {
		for x := 0; x < 100; x++ {
			img.Set(x, y, color.RGBA{255, 255, 255, 255})
		}
	}

	// 绘制验证码文本
	// 这里可以使用 freetype 库来绘制文字
	// 简化示例，直接绘制字符（实际应用中建议使用字体库）

	// 添加干扰线
	for i := 0; i < 5; i++ {
		x1 := rand.Intn(100)
		y1 := rand.Intn(40)
		x2 := rand.Intn(100)
		y2 := rand.Intn(40)
		drawLine(img, x1, y1, x2, y2)
	}

	// 绘制验证码文本
	charWidth := 50
	for i, char := range code {
		x := 15 + i*charWidth
		y := 25
		// 为每个字符设置不同颜色
		color := color.RGBA{
			uint8(rand.Intn(200)),
			uint8(rand.Intn(200)),
			uint8(rand.Intn(200)),
			255,
		}
		// 简单的文字绘制（实际项目中建议使用字体库）
		drawChar(img, char, x, y, color)
	}
	return code, img, nil
}

// drawLine 绘制干扰线
func drawLine(img *image.RGBA, x1, y1, x2, y2 int) {
	dx := abs(x2 - x1)
	dy := abs(y2 - y1)
	sx, sy := 1, 1
	if x1 >= x2 {
		sx = -1
	}
	if y1 >= y2 {
		sy = -1
	}
	err := dx - dy

	for {
		img.Set(x1, y1, color.RGBA{0, 0, 0, 255})
		if x1 == x2 && y1 == y2 {
			break
		}
		e2 := 2 * err
		if e2 > -dy {
			err -= dy
			x1 += sx
		}
		if e2 < dx {
			err += dx
			y1 += sy
		}
	}
}

// drawChar 简单绘制字符（实际项目中建议使用字体库）
func drawChar(img *image.RGBA, char rune, x, y int, clr color.RGBA) {
	// 这里只是简单示例，实际应该使用字体库如freetype
	// 为简化实现，我们手动绘制数字字符
	charMap := getCharMap(char)

	for i, row := range charMap {
		for j, pixel := range row {
			if pixel == 1 {
				img.Set(x+j, y+i-5, clr)
			}
		}
	}
}

// getCharMap 获取字符的点阵图
func getCharMap(char rune) [][]int {
	// 简化的字符点阵图，实际应该加载字体文件
	maps := map[rune][][]int{
		'0': {{0, 1, 1, 0}, {1, 0, 0, 1}, {1, 0, 0, 1}, {1, 0, 0, 1}, {0, 1, 1, 0}},
		'1': {{0, 1, 0, 0}, {1, 1, 0, 0}, {0, 1, 0, 0}, {0, 1, 0, 0}, {1, 1, 1, 1}},
		'2': {{1, 1, 1, 0}, {0, 0, 0, 1}, {0, 1, 1, 0}, {1, 0, 0, 0}, {1, 1, 1, 1}},
		'3': {{1, 1, 1, 0}, {0, 0, 0, 1}, {0, 1, 1, 0}, {0, 0, 0, 1}, {1, 1, 1, 0}},
		'4': {{1, 0, 1, 0}, {1, 0, 1, 0}, {1, 1, 1, 1}, {0, 0, 1, 0}, {0, 0, 1, 0}},
		'5': {{1, 1, 1, 1}, {1, 0, 0, 0}, {1, 1, 1, 0}, {0, 0, 0, 1}, {1, 1, 1, 0}},
		'6': {{0, 1, 1, 0}, {1, 0, 0, 0}, {1, 1, 1, 0}, {1, 0, 0, 1}, {0, 1, 1, 0}},
		'7': {{1, 1, 1, 1}, {0, 0, 0, 1}, {0, 0, 1, 0}, {0, 1, 0, 0}, {1, 0, 0, 0}},
		'8': {{0, 1, 1, 0}, {1, 0, 0, 1}, {0, 1, 1, 0}, {1, 0, 0, 1}, {0, 1, 1, 0}},
		'9': {{0, 1, 1, 0}, {1, 0, 0, 1}, {0, 1, 1, 1}, {0, 0, 0, 1}, {0, 1, 1, 0}},
	}

	if m, ok := maps[char]; ok {
		return m
	}
	return [][]int{{0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}, {0, 0, 0, 0}}
}

// abs 绝对值
func abs(x int) int {
	if x < 0 {
		return -x
	}
	return x
}
